/**
 * @copyright Copyright (c) 2025 Cation. 保留所有权利.
 * @file main.c
 * @brief 时间轮调度算法-示例程序
 * @version 1.0.0
 * @author Lxh
 * @date 2025-07-27
 * @details 
 * @note 
 * @history
 */
#include <stdio.h>
#include "timing_wheel.h"

// 示例回调函数
void print_message(void *arg) {
    char *msg = (char*)arg;
    printf("Timer: %s\n", msg);
}
// 平台特定的时间函数
#if PLATFORM_WINDOWS
static uint32_t get_current_time_ms() {
    return GetTickCount();
}

static void sleep_ms(uint32_t ms) {
    Sleep(ms);
}
#elif PLATFORM_LINUX
static uint32_t get_current_time_ms() {
    struct timespec ts;
    clock_gettime(CLOCK_MONOTONIC, &ts);
    return ts.tv_sec * 1000 + ts.tv_nsec / 1000000;
}

static void sleep_ms(uint32_t ms) {
    usleep(ms * 1000);
}
#elif PLATFORM_EMBEDDED
// 嵌入式平台需要用户实现这些函数
extern uint32_t get_current_time_ms(void); // 实现示例在下方
extern void sleep_ms(uint32_t ms);
#endif
// 嵌入式平台实现示例
#if PLATFORM_EMBEDDED
// 系统时间计数器（基于SysTick）
static volatile uint32_t system_tick = 0;

// SysTick中断处理函数
void SysTick_Handler(void) {
    system_tick++;
}

uint32_t get_current_time_ms(void) {
    return system_tick;
}

void sleep_ms(uint32_t ms) {
    uint32_t start = system_tick;
    while ((system_tick - start) < ms);
}

// 使用硬件定时器驱动时间轮
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
    if (htim->Instance == TIM1) {  // 假设使用TIM1
        static timing_wheel_t *tw = NULL;
        if (!tw) return;
        timing_wheel_tick(tw);
    }
}
#endif


// 测试主程序
#if !PLATFORM_EMBEDDED
int main() {
    // 初始化时间轮（每100ms一个tick）
    timing_wheel_t *tw = timing_wheel_init(100);
    if (!tw) {
        fprintf(stderr, "Failed to initialize timing wheel\n");
        return 1;
    }

    // 添加定时器
    timing_wheel_add(tw, 500, print_message, "500ms timer");
    timing_wheel_add(tw, 1000, print_message, "1s timer");
    timing_wheel_add(tw, 2000, print_message, "2s timer");
    
    printf("Timing wheel started...\n");
    
    // 主循环
    while (1) {
        timing_wheel_update(tw);
        sleep_ms(10);  // 10ms延迟减少CPU占用
    }

    timing_wheel_destroy(tw);
    return 0;
}
#endif